#include <stdio.h>

/**
 * 运算符优先级
 */
int main(void) {

	int i = 1, j = 1,
			k1 = 10, k2 = 20, k3 = 30, k4 = 40, k5 = 50,
			k, h, m, n;

	float a = 7, b = 6, c = 5, d = 4,
			e, p, q, x, y, z;

	// 自增前
	printf("Before increment, i = %2d, j = %2d\n", i, j);

	// i 先赋值给了 k ，然后 i 在进行运算
	k = i++;
	// i 先进行运算， 然后赋值给 k
	h = ++j;

	// 自增后
	printf("After increment, i = %2d, j = %2d\n"
		   "k = %2d, h = %2d\n\n", i, j, k, h);

	// 两个整数类型相除，商的小数部分将会舍弃
	m = 6 / 4;
	p = 6 / 4;

	n = 6 / 4.0;
	q = 6 / 4.0F;

	printf("m = %2d, p = %3.1f\n"
		   "n = %2d, q = %3.1f\n\n", m, p, n, q);


	printf("Original k1 = %2d, k2 = %2d, k3 = %2d, k4 = %2d, k5 = %2d\n",
		   k1, k2, k3, k4, k5);

	k1 += 2;
	k2 -= i;
	k3 *= (8 / 4);
	k4 /= 2.0;
	k5 %= 2;

	printf("New k1 = %2d, k2 = %2d, k3 = %2d, k4 = %2d, k5 = %2d\n\n",
		   k1, k2, k3, k4, k5);


	e = 3;
	x = a + b - c / d * e;
	y = a + (b - c) / d * e;
	z = ((a + b) - c / d) * e;

	printf("a = %3.0f, b = %3.0f, c = %3.0f\n"
		   "d = %3.1f, e = %3.1f\n\n", a, b, c, d, e);

	printf("x = a + b - c / d * e = %10.3f\n"
		   "y = a + (b - c) / d * e = %10.3f\n"
		   "z = ((a + b) - c / d) * e = %10.3f\n", x, y, z);

	int i1, i2, i3;
	// 赋值语句是从右到左的顺序
	i1 = i2 = i3 = 2 * 3;
	printf("i1 = %2d, i2 = %2d, i3 = %2d\n", i1, i2, i3);

	int default_int;
	float default_float;
	double default_double;
	char default_char;
	short default_short;
	long default_long;
	printf("default_int = %d\n", default_int);
	printf("default_float = %f\n", default_float);
	printf("default_double = %f\n", default_double);
	printf("default_char = %c\n", default_char);
	printf("default_short = %d\n", default_short);
	printf("default_long = %ld\n", default_long);

	/*
	 * 算术运算符
	 * 运算符	名字	运算数数目	位置	结合型	优先级
	 * (		括号	单目		前置	左到右	1
	 * )		括号	单目		后置	左到右	1
	 * +		正号	单目		前置	右到左	2
	 * -		负号	单目		前置	右到左	2
	 * ++		后置增1	单目		后置	左到右	2
	 * --		后置减1	单目		后置	左到右	2
	 * ++		前置增1	单目		前置	右到左	2
	 * --		前置减1	单目		前置	右到左	2
	 * %=		求余赋值	双目		中置	右到左	2
	 * *=		乘赋值	双目		中置	右到左	2
	 * /=		除赋值	双目		中置	右到左	2
	 * +=		加赋值	双目		中置	右到左	2
	 * -=		减赋值	双目		中置	右到左	2
	 * %		求余	双目		中置	左到右	3
	 * *		乘		双目		中置	左到右	3
	 * /		除		双目		中置	左到右	3
	 * +		加		双目		中置	左到右	4
	 * -		减		双目		中置	左到右	4
	 * =		赋值	双目		中置	右到左	5
	 */
}